﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Poco;

namespace Metier
{
    public class GestionPreparationPlat
    {
        GestionNotification gestionNotification = new GestionNotification();
        
        public void annoncerPlatPret(PreparationPlat plat)
        {
            plat.setEtatCommande(EtatPlat.PlatPret);
            MiseAJour(plat);

            Notification notif = new Notification();
            notif.setType(TypeNotification.PlatPret);
            notif.Fait = false;
            notif.Serveur = plat.Commande.Table.Zone.Serveur;
            
            gestionNotification.Ajouter(notif);

        }

        public void Ajouter(PreparationPlat plat)
        {
            try
            {
                using (Context db = new Context())
                {
                    db.PreparationPlats.AddObject(plat);
                    db.SaveChanges();
                }
            }
            catch (ArgumentNullException ex)
            {
                throw new Exception("Erreur Repository : Echec Ajout : Plat en cours est null", ex);
            }
            catch (Exception ex)
            {
                throw new Exception("Erreur Repository : Echec Ajout Plat en cours avec l'id : " + plat.Id, ex);
            }
        }

        public PreparationPlat RecupererParId(int platEnCoursId)
        {
            try
            {
                using (Context db = new Context())
                {
                    return db.PreparationPlats.Where(p => p.Id == platEnCoursId).FirstOrDefault();
                }
            }
            catch (ArgumentOutOfRangeException ex)
            {
                throw new Exception("Erreur Repository : Echec Recuperation  ce PlatEnCoursId n'existe pas", ex);
            }
            catch (ArgumentNullException ex)
            {
                throw new Exception("Erreur Repository : Echec Recuperation : PlatEnCoursId est null", ex);
            }
            catch (Exception ex)
            {
                throw new Exception("Erreur Repository : Echec Recuperation Plat en cours avec l'id : " + platEnCoursId, ex);
            }
        }

        public PreparationPlat RecupererParCuisinier(Cuisinier cuisinier)
        {
            try
            {
                using (Context db = new Context())
                {
                    return (from p in db.PreparationPlats
                            where p.Cuisinier.Id  == cuisinier.Id
                            select p).FirstOrDefault();
                }
            }

            catch (Exception ex)
            {
                throw new Exception("Erreur Repository : Echec Recuperation Plat en cours avec le cuisinier : " + cuisinier, ex);
            }
        }

        public PreparationPlat RecupererParDate(DateTime date)
        {
            try
            {
                using (Context db = new Context())
                {
                    return (from p in db.PreparationPlats
                            where p.DateSoumission == date
                            select p).FirstOrDefault();
                }
            }

            catch (Exception ex)
            {
                throw new Exception("Erreur Repository : Echec Recuperation Plat en cours avec la date : " + date, ex);
            }
        }

        public List<PreparationPlat> RecupererTous()
        {
            try
            {
                using (Context db = new Context())
                {
                    return db.PreparationPlats.ToList();
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Erreur Repository : Echec Recuperation tous les Plats en cours", ex);
            }
        }

        public void AssignerPreparationPlat(PreparationPlat plat, Cuisinier cuisinier)
        {
            plat.Cuisinier = cuisinier;
            MiseAJour(plat);
        }

        public void MiseAJour(PreparationPlat plat)
        {
            try
            {
                using (Context db = new Context())
                {
                    db.PreparationPlats.Attach(plat);
                    db.ObjectStateManager.ChangeObjectState(plat, System.Data.EntityState.Modified);
                    db.SaveChanges();
                }
            }
            catch (ArgumentNullException ex)
            {
                throw new Exception("Erreur Repository : Echec Mise a jour Plat en cours : nouveau Plat en cours est null", ex);
            }
            catch (Exception ex)
            {
                throw new Exception("Erreur Repository : Echec Mise a jour Plat en cours avec l'id : " + plat.Id, ex);
            }
        }

        public void Supprimer(PreparationPlat plat)
        {
            try
            {
                using (Context db = new Context())
                {
                    db.PreparationPlats.DeleteObject(plat);
                    db.SaveChanges();
                }
            }
            catch (ArgumentNullException ex)
            {
                throw new Exception("Erreur Repository : Echec Suppression Plat en cours: Plat en cours est null", ex);
            }
            catch (Exception ex)
            {
                throw new Exception("Erreur Respository : Echec Suppression Plat en cours avec l'id : " + plat.Id, ex);
            }
        }
        
    }
}
